from datetime import timedelta
from django.db import models
from django.utils import timezone
from phonenumber_field.modelfields import PhoneNumberField


class ProductFolder(models.Model):
    """
    Папка в которую группируются продукты
    Имена уникальные?
    """
    name = models.CharField(max_length=200, verbose_name="Название папки")

    def __str__(self) -> str:
        return self.name


class Product(models.Model):
    """
    Product model класс для продуктов, то есть курсов
    """
    name = models.CharField(max_length=200, unique=True, blank=False, verbose_name="Название курса")
    description = models.TextField(default='', blank=True, verbose_name="Описание")
    enabled = models.BooleanField(default=False, verbose_name="Доступен для продажи")
    folder = models.ForeignKey(ProductFolder, default=1, on_delete=models.PROTECT)
    price = models.IntegerField(default=10000, verbose_name="Цена полная")
    price_overseas_percent = models.FloatField(default=0.0, verbose_name="Добавка к цене для иностранцев в %")
    price_rising = models.BooleanField(default=False, verbose_name="Использовать повышение цены")  # если False, то используем price
    price_min = models.IntegerField(default=10000, verbose_name="Цена минимальной")
    price_min_date = models.DateTimeField(default=timezone.now, verbose_name="Дата повышения минимальной цены")
    # price_mid = models.IntegerField(default=10000, verbose_name="Цена средняя")
    # price_mid_date = models.DateTimeField(verbose_name="Дата повышения средней цены")

    loan_allowed = models.BooleanField(default=True, verbose_name="Доступен для покупки в креди")
    remind_to_pay = models.BooleanField(default=False, verbose_name="Напоминание об оплате")
    remind_to_pay_interval = models.IntegerField(default=24, verbose_name="Через какое время послать в часах")
    course_to_bind = models.CharField(max_length=100, default='', blank=True, verbose_name="Секретный ключ (пусто - не добавлять на платформу)")
    integration_id = models.IntegerField(default=0, verbose_name="id интеграции")
    payment_successful_url = models.CharField(max_length=200, default='', blank=True, verbose_name="Страница успешной оплаты (пусто-стандартная)")
    payment_unsuccessful_url = models.CharField(max_length=200, default='', blank=True, verbose_name="Страница НЕ успешной оплаты (пусто-стандартная)")
    payment_successful_email_custom = models.BooleanField(default=False, verbose_name="Посылать ли собственное письмо вместо стандартного")
    payment_successful_email_subject = models.CharField(max_length=200, default='', blank=True, verbose_name="Тема письма")
    payment_successful_email_body = models.TextField( default='', blank=True, verbose_name="Текст письма")
    subscription_lists = models.CharField(max_length=80, default='', blank=True, verbose_name="Список id подписных листов через запятую")
    created = models.DateTimeField(auto_now_add=True, help_text="Время создания") #default=timezone.now,
    updated = models.DateTimeField(auto_now=True, help_text="Последнее изменение")

    def __str__(self) -> str:
        return self.name


class Client(models.Model):
    email = models.EmailField(unique=True, blank=False, db_index=True, verbose_name="Email")
    name = models.CharField(max_length=63, blank=False, db_index=True, verbose_name="Имя")
    surname = models.CharField(max_length=63, blank=False, db_index=True, verbose_name="Фамилия")
    lastname = models.CharField(max_length=63, default='', blank=True, db_index=True, verbose_name="Отчество")
    phone = PhoneNumberField(blank=True, unique=False, db_index=True, verbose_name="Номер телефона")
    ban = models.BooleanField(default=False, verbose_name="БАН Запрещено покупать курсы")
    ban_description = models.CharField(max_length=127, default='', blank=True, verbose_name="Причина БАНа")
    created = models.DateTimeField(auto_now_add=True, help_text="Время создания") # default=timezone.now,
    updated = models.DateTimeField(auto_now=True, help_text="Последнее изменение")

    def __str__(self) -> str:
        return f"{self.name} {self.surname} {self.email}"

class PaymentGate(models.Model):
    name = models.CharField(max_length=63, blank=True, unique=True, verbose_name="Имя платежного гейта")

    def __str__(self) -> str:
        return self.name


class Order(models.Model):
    """
    Заказ оплаченный или нет
    """
    ORDER_STATUS = {
        0: "Создан",
        1: "Не обрабатывался",
        2: "Оставил контакты",
        3: "Пробовал оплатить",
        4: "Оплачено",
        5: "Возврат",
        6: "Отменил заказ",
        7: "Удален",
    }

    ORDER_STATUS_INVERSE = dict(map(reversed, ORDER_STATUS.items()))

    product = models.ForeignKey(Product, on_delete=models.RESTRICT, verbose_name="Курс")
    client = models.ForeignKey(Client, on_delete=models.RESTRICT, db_index=True, verbose_name="Клиент")
    name = models.CharField(max_length=63, editable=False, db_index=True, verbose_name="Имя (в счете)")
    surname = models.CharField(max_length=63, editable=False, db_index=True, verbose_name="Фамилия (в счете)")
    phone = PhoneNumberField(blank=True, unique=False, editable=False, verbose_name="Номер телефона (в счете)")
    payment_gate = models.ForeignKey(PaymentGate, default=None, null=True, on_delete=models.SET_NULL, verbose_name="Платежный гейт")
    price = models.IntegerField(default=10000)
    status = models.IntegerField(default=0, choices=ORDER_STATUS)
    profit = models.DecimalField(default=0.00, max_digits=10, decimal_places=2)
    client_comment = models.CharField(max_length=127, default="", blank=True, verbose_name="Комментарий клиента")
    seller_comment = models.CharField(max_length=127, default="", blank=True, verbose_name="Комментарий продавца")
    promocode = models.CharField(max_length=63, default='', blank=True, verbose_name="Отчество")
    created = models.DateTimeField(auto_now_add=True, help_text="Время создания")
    updated = models.DateTimeField(auto_now=True, help_text="Последнее изменение")

    def __str__(self) -> str:
        return f"{self.id} {self.surname} {self.client.email} {self.price} {Order.ORDER_STATUS[self.status]}"


class LeadSource(models.Model):
    """
    Модель для сохранения источника перехода клиента на оплату
    """
    order = models.ForeignKey(Order, on_delete=models.CASCADE, db_index=True, verbose_name="Заказ")
    utm_source = models.CharField(max_length=127, default=None, null=True, db_index=True, help_text="С какого сайта или канала пришёл трафик.")
    utm_medium = models.CharField(max_length=127, default=None, null=True, blank=True, help_text="Какой тип перехода был использован, например cost per click или email.")
    utm_campaign = models.CharField(max_length=127, default=None, null=True, blank=True, help_text="Какой продукт или рекламная кампания.")
    utm_term = models.CharField(max_length=255, default=None, null=True, blank=True, help_text="Список ключевых слов.")
    utm_content = models.CharField(max_length=255, default=None, null=True, blank=True, help_text="Что конкретно кликнули, например баннер или текстовую ссылку.")
    gclid = models.CharField(max_length=255, default=None, null=True, blank=True, help_text="Identifies a Google click, is used for ad tracking via Google Ads")
    #aclk = models.CharField(max_length=255, default=None, null=True, blank=True, help_text="Identifies a Microsoft Ad click (bing), is used for ad tracking.")
    #msclkid = models.CharField(max_length=255, default=None, null=True, blank=True, help_text="Identifies a Microsoft Ad click (MS ad network), is used for ad tracking.")
    twclid = models.CharField(max_length=255, default=None, null=True, blank=True, help_text="Identifies a Twitter Ad click, is used for ad tracking.")
    fbclid = models.CharField(max_length=255, default=None, null=True, blank=True, help_text="Identifies a Facebook Ad click, is used for ad tracking.")
    yalid = models.CharField(max_length=31, default=None, null=True, blank=True, help_text="Identifies a Yandex Metrica. yandexuid")
    ym_uid = models.CharField(max_length=31, default=None, null=True, blank=True, help_text="Identifies a Yandex Ad click, is used for ad tracking. _ym_uid")
    #custom_tags = models.JSONField(default=dict, null=True, blank=True, help_text="Dict of custom tag:value pairs as defined by the UTM_TRACKER_CUSTOM_TAGS setting.")
    created = models.DateTimeField(auto_now_add=True, db_index=True, help_text="Время создания")

    class Meta:
        get_latest_by = ("created",)

    def __str__(self) -> str:
        return f"{self.order.id}: {self.utm_source}/{self.utm_medium}"
    #
    # def __repr__(self) -> str:
    #     return (
    #         f"<LeadSource id={self.id} user={self.user_id} "
    #         f"medium='{self.medium}' source='{self.source}'>"
    #     )


